package com.atguigu.tingshu.order.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.shaded.com.google.gson.JsonObject;
import com.atguigu.tingshu.album.client.AlbumInfoFeignClient;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.order.OrderInfo;
import com.atguigu.tingshu.order.helper.SignHelper;
import com.atguigu.tingshu.order.mapper.OrderInfoMapper;
import com.atguigu.tingshu.order.service.OrderInfoService;
import com.atguigu.tingshu.user.client.UserInfoFeignClient;
import com.atguigu.tingshu.vo.order.OrderDerateVo;
import com.atguigu.tingshu.vo.order.OrderDetailVo;
import com.atguigu.tingshu.vo.order.OrderInfoVo;
import com.atguigu.tingshu.vo.order.TradeVo;
import com.atguigu.tingshu.vo.user.UserInfoVo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo> implements OrderInfoService {

    @Autowired
    private OrderInfoMapper orderInfoMapper;
    @Autowired
    private AlbumInfoFeignClient albumInfoFeignClient;
    @Autowired
    private UserInfoFeignClient userInfoFeignClient;


    /**
     * 获取点击结算后的订单结算页
     * @param tradeVo
     * @param userId
     * @return
     */
    @Override
    public OrderInfoVo trade(TradeVo tradeVo, Long userId) {
//        思路：回显结算页的订单详情，给当前这个对象中的属性赋值：
        OrderInfoVo orderInfoVo = new OrderInfoVo();
//        1.查出订单的1原始金额：
        BigDecimal originalAmount = new BigDecimal("0.00");
        BigDecimal derateAmount = new BigDecimal("0.00");
        BigDecimal orderAmount = new BigDecimal("0.00");
//        2.生成订单明细：
        List<OrderDetailVo> orderDetailVoList = new ArrayList<>();
//        3.生成减免明细：
        List<OrderDerateVo> orderDerateVoList = new ArrayList<>();
//        获取用户信息：
        Result<UserInfoVo> userInfoVoResult = userInfoFeignClient.getUserInfoVo(userId);
        Assert.notNull(userInfoVoResult,"查询用户信息失败！");
        UserInfoVo userInfoVo = userInfoVoResult.getData();
        Assert.notNull(userInfoVo,"查询用户信息为空！");

        if (tradeVo.getItemType().equals(SystemConstant.ORDER_ITEM_TYPE_ALBUM)){
//            ①购买专辑：
            Result<AlbumInfo> albumInfoResult = albumInfoFeignClient.getAlbumInfo(tradeVo.getItemId());
            Assert.notNull(albumInfoResult,"查询专辑信息失败！");
            AlbumInfo albumInfo = albumInfoResult.getData();
            Assert.notNull(albumInfo,"查询专辑信息为空！");
//            判断用户身份：
            if (userInfoVo.getIsVip().intValue() == 1 && userInfoVo.getVipExpireTime().after(new Date())){
////            是vip，上vip折扣,比如100原价打八折，折扣是20%，100*（10-8）/10
                if (albumInfo.getVipDiscount().compareTo(new BigDecimal("-1")) > 0){ //是vip，上vip折扣
                    derateAmount = albumInfo.getPrice().multiply(new BigDecimal("10").subtract(albumInfo.getVipDiscount())).divide(new BigDecimal("10"),2, RoundingMode.HALF_UP);
                }
            }else { //不是vip
                if (albumInfo.getDiscount().compareTo(new BigDecimal("-1"))>0){
//                    但是有普通折扣
                    derateAmount = albumInfo.getPrice().multiply(new BigDecimal("10").subtract(albumInfo.getDiscount())).divide(new BigDecimal("10"),2, RoundingMode.HALF_UP);
                }
            }
            orderAmount = originalAmount.subtract(derateAmount);
//            判断当前专辑是否有折扣（有的专辑不管用户是不是vip都不打折：
//            if (albumInfo.getVipDiscount().compareTo(new BigDecimal("-1")) > 0){ //判断当前专辑是否有折扣，和-1做数据比较，只要大于-1都是有折扣的
////                > -1 ，有折扣，就判断用户身份：
//                if (userInfoVo.getIsVip().intValue() == 1 && userInfoVo.getVipExpireTime().after(new Date())) {
//                }else if (albumInfo.getDiscount().compareTo(new BigDecimal("-1"))>0){
////                    不是vip，上普通折扣！
////                    ①没有折扣：
//                    derateAmount = albumInfo.getPrice().multiply(new BigDecimal("10").subtract(albumInfo.getDiscount())).divide(new BigDecimal("10"),2, RoundingMode.HALF_UP);
//                }
//            }

//            获取到专辑原价：
            originalAmount = albumInfo.getPrice();

        }else if (tradeVo.getItemType().equals(SystemConstant.ORDER_ITEM_TYPE_TRACK)){
//            ②购买声音：

        }else {
//            ③购买vip：
        }


        //        1.组装需要返给前端的数据结构（订单信息）
//        ①订单号（不重复的uuid）
        String tradeNo = UUID.randomUUID().toString().replaceAll("-","");
        orderInfoVo.setTradeNo(tradeNo);
        orderInfoVo.setPayWay("");
        orderInfoVo.setItemType(tradeVo.getItemType());
        orderInfoVo.setOriginalAmount(originalAmount);
        orderInfoVo.setDerateAmount(derateAmount);
        orderInfoVo.setOrderAmount(orderAmount);
        orderInfoVo.setOrderDetailVoList(orderDetailVoList);
        orderInfoVo.setOrderDerateVoList(orderDerateVoList);
        orderInfoVo.setTimestamp(SignHelper.getTimestamp()); //签名：防止用户非法篡改数据，保证接口的安全性！
        String orderJson = JSONObject.toJSONString(orderInfoVo);//给orderInfoVo转为Json字符串
        String sign = SignHelper.getSign(JSONObject.parseObject(orderJson,Map.class)); //给Json字符串转为签名sign
        orderInfoVo.setSign(sign);
        return null;

    }
}
